/*
 * Implementacion de Automata Finito.
 * 
 * Basado en el proyecto descrito en: 
 * Louden, K. (1997). Compiler Construction: Principles and Practice. Boston: PWS.
 * 
 * @ Project: Compiler
 * @ File Name: Automaton.java
 * @ Date: 21/09/2008
 */

package cml.scanning.automata;

import cml.TokenType;

public abstract class Automaton{
	
	protected boolean acceptState[];
	protected Branch successorFunc[][];
	protected String tokenString;
	protected TokenType currentToken;
	protected boolean backtrack;
	protected final int NO_BRANCH = -1;
	
	/*
	 * Ejecuta la siguiente transicion (si la hay) leyendo el caracter pasado 
	 * como parametro.
	 * 
	 * @param	char	el siguiente caracter a leer
	 * @return			<code>true</code> si ejecuto una transicion; 
	 * 					<code>false</code> en caso contrario
	 */
	public abstract boolean nextStep(char c);
	
	/*
	 * Regresa el <code>token</code> encontrado.
	 * 
	 * @return	el <code>token</code> encontrado
	 */
	public TokenType getToken(){
		
		return this.currentToken;	
	}
	
	/*
	 * Regresa el lexema del <code>token</code> encontrado.
	 * 
	 * @return	el lexema del <code>token</code> encontrado
	 */
	public String getTokenString(){

		return this.tokenString;	
	}
	
	/*
	 * Indica si se debe consumir o no el caracter leido en 
	 * <code>nextStep</code>.
	 * 
	 * @return	<code>true</code> si se consume el caracter; 
	 * 			<code>false</code> en caso contrario
	 */
	public boolean backtrack(){
		
		return this.backtrack;
	}
	
	/*
	 * Reinicia al automata.
	 */
	public abstract void restart();
	
	/*
	 * Indica si el estado actual es el inicial.
	 * 
	 * @return	<code>true</code> si es el estado inicial;
	 * 			<code>false</code> en caso contrario
	 */
	public abstract boolean inStartState();	
	
	/*
	 * Indica si el estado actual es de aceptacion.
	 * 
	 * @return	<code>true</code> si es estado de aceptacion;
	 * 			<code>false</code> en caso contrario
	 */
	public abstract boolean isDone();
}
